//=============================================================================
/**
 *
 *	@file		bug_select_msg.c
 *	@brief		ポケスロン:イベントシーン用簡易メッセージモジュール
 *	@author		hosaka genya
 *	@data		2008.10.30
 *
 *	@note		メッセージウィンドウがMAIN画面固定
 */
//=============================================================================
#include "common.h"
#include "gflib/touchpanel.h"
#include "system/fontproc.h"
#include "system/msgdata_util.h"
#include "system/window.h"

#include "savedata/config.h"

#include "msgdata/msg.naix"

#include "bug_select_msg.h"

//=============================================================================
/**
 *								定数定義
 */
//=============================================================================
enum
{
	MSG_WAIT		= 0,
	// -- テキストウィンドウの設定値 --
	AGBPOKEMON_FRAMECHR		= 0x3F0,
	AGBPOKEMON_FRAMECOL		= 14,
	AGBPOKEMON_TFRAMECHR	= AGBPOKEMON_FRAMECHR - TALK_WIN_CGX_SIZ,
	AGBPOKEMON_TFRAMECOL	= 13,
};

//=============================================================================
/**
 *								構造体定義
 */
//=============================================================================
typedef struct BUGSLT_MSG_CNT_tag
{
	GF_BGL_INI		*bgl;
	NUMFONT			*NumFont;
	WORDSET			*WordSet;
	MSGDATA_MANAGER	*MsgMng;
	STRBUF			*MsgBuf;
	CONFIG			*cfg;
	HEAPID			HeapID;

	GF_BGL_BMPWIN	MsgWin;
	int				MsgID;
	u32				Wait : 16;
	u32				BgFrm : 3;
	u32				bSkip : 1;
	u32				DummyBit : 12;
}BUGSLT_MSG_CNT;

//=============================================================================
/**
 *							プロトタイプ宣言
 */
//=============================================================================
// -- prototype --
static void MsgWinSet(GF_BGL_INI *bgl, u8 BgFrm, const int inHeapID);

static int CreateMsgWindow(GF_BGL_INI *bgl, GF_BGL_BMPWIN *win, STRBUF **msg,
		WORDSET *word, MSGDATA_MANAGER *msgman, const int inMsgID, const u8 BgFrm, const int inHeapID, const CONFIG* cfg );

static void PrintStaticMessage(GF_BGL_INI *bgl, GF_BGL_BMPWIN *win,	WORDSET *word, MSGDATA_MANAGER *msgman,
		const int inMsgID, const u8 BgFrm, const u8 xofs, const u8 yofs, GF_PRINTCOLOR col, const int inHeapID);

//=============================================================================
/**
 *								外部公開関数
 */
//=============================================================================

//-----------------------------------------------------------------------------
/**
 *	@brief	システム生成
 *
 *	@param	HEAPID HeapID
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
MSG_CNT_PTR MSG_CNT_Create( HEAPID HeapID )
{
	MSG_CNT_PTR ptr;

	// メインワーク確保
	ptr = sys_AllocMemory( HeapID, sizeof(BUGSLT_MSG_CNT) );
	//メモリクリア
	MI_CpuClear8( ptr, sizeof(BUGSLT_MSG_CNT) );

	ptr->HeapID = HeapID;

	// NUMFONT 生成
	ptr->NumFont = NUMFONT_Create( 1, 2, FBMP_COL_NULL, ptr->HeapID );

	return ptr;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	初期化
 *
 *	@param	MSG_CNT_PTR ptr
 *	@param	bgl
 *	@param	BgFrm
 *	@param	cfg
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_Init( MSG_CNT_PTR ptr, GF_BGL_INI* bgl, u8 BgFrm, CONFIG* cfg )
{
	ptr->bgl = bgl;
	ptr->MsgID = MSG_ID_NONE;
	ptr->BgFrm = BgFrm;
	ptr->cfg = cfg;

	//メッセージマネージャとワードセットの確保
	ptr->MsgMng = MSGMAN_Create(MSGMAN_TYPE_DIRECT, ARC_MSG, NARC_msg_bug_select_dat, ptr->HeapID);
	ptr->WordSet = WORDSET_Create(ptr->HeapID);

	//プリントタスク初期化
	MSG_PrintInit();
	MsgWinSet(ptr->bgl, ptr->BgFrm, ptr->HeapID);

	/* メッセージのフォントカラーを設定 */
	SystemFontPaletteLoad( PALTYPE_MAIN_BG, /*FONT_PALNO_NORMAL*/15 * 32, ptr->HeapID);
	//1キャラ目をＮＵＬＬデータでフィルする
	GF_BGL_CharFill(ptr->bgl, ptr->BgFrm, 0, 1 ,0);
}

//-----------------------------------------------------------------------------
/**
 *	@brief	開放処理
 *
 *	@param	MSG_CNT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_Delete( MSG_CNT_PTR ptr )
{
	// 表示中の文字を強制終了
	MSG_CNT_PrintEnd( ptr );

	MSGMAN_Delete( ptr->MsgMng );
	WORDSET_Delete( ptr->WordSet );

	if ( ptr->MsgBuf!=NULL )
	{
		STRBUF_Delete( ptr->MsgBuf );
	}

	NUMFONT_Delete( ptr->NumFont );

	// メインワーク開放
	sys_FreeMemoryEz( ptr );
}
//-----------------------------------------------------------------------------
/**
 *	@brief	メイン処理
 *
 *	@param	MSG_CNT_PTR ptr
 *
 *	@retval	TRUE:メッセージ表示中
 */
//-----------------------------------------------------------------------------
BOOL MSG_CNT_Main( MSG_CNT_PTR ptr )
{

	if ( ptr->MsgID != MSG_ID_NONE )
	{
		//メッセージを登録
		if ( GF_MSG_PrintEndCheck( ptr->MsgID ) == 0 )
		{
			//表示ウェイトセット
			ptr->Wait = MSG_WAIT;
			//バッファ解放
			STRBUF_Delete( ptr->MsgBuf );
			ptr->MsgBuf = NULL;
			//メッセージＩＤをクリア
			ptr->MsgID = MSG_ID_NONE;
		}
		return TRUE;
	}
	else
	{
		//メッセージ表示ウェイトデクリメント
		if (ptr->Wait > 0)
		{
			// メッセージ飛ばし処理
			if( ptr->bSkip == TRUE )
			{
				ptr->Wait = 0;
				ptr->bSkip = FALSE;
			}
			else
			{
				ptr->Wait--;
				return TRUE;
			}
		}
	}

	return FALSE;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	メッセージプリント
 *
 *	@param	MSG_CNT_PTR ptr
 *	@param	win
 *	@param	inMsgID
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_PrintMessage( MSG_CNT_PTR ptr, int inMsgID )
{
	ptr->MsgID = CreateMsgWindow( ptr->bgl, &ptr->MsgWin, &ptr->MsgBuf,
								  ptr->WordSet, ptr->MsgMng, inMsgID, ptr->BgFrm, ptr->HeapID, ptr->cfg );
}


#define	COL_BLACK	( GF_PRINTCOLOR_MAKE( 1,  2,  0 ) )		// フォントカラー：黒
//-----------------------------------------------------------------------------
/**
 *	@brief	指定ウィンドウにメッセージを一括表示
 *
 *	@param	MSG_CNT_PTR ptr
 *	@param	win
 *	@param	inMsgID
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_PrintBmpMessage( MSG_CNT_PTR ptr, GF_BGL_BMPWIN* win, int inMsgID, u8 xofs, u8 yofs )
{
	PrintStaticMessage( ptr->bgl, win, ptr->WordSet, ptr->MsgMng, inMsgID, ptr->BgFrm, xofs, yofs, COL_BLACK, ptr->HeapID );
}

//-----------------------------------------------------------------------------
/**
 *	@brief
 *
 *	@param	MSG_CNT_PTR ptr
 *	@param	win
 *	@param	inMsgID
 *	@param	xofs
 *	@param	yofs
 *	@param	col
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_PrintBmpMessageEx( MSG_CNT_PTR ptr, GF_BGL_BMPWIN* win, int inMsgID, u8 xofs, u8 yofs, GF_PRINTCOLOR col )
{
	PrintStaticMessage( ptr->bgl, win, ptr->WordSet, ptr->MsgMng, inMsgID, ptr->BgFrm, xofs, yofs, col, ptr->HeapID );
}


//-----------------------------------------------------------------------------
/**
 *	@brief
 *
 *	@param	MSG_CNT_PTR ptr
 *	@param	win
 *	@param	num
 *	@param	figure
 *	@param	b_mark
 *	@param	mark
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_PrintBmpNumFont( MSG_CNT_PTR ptr, GF_BGL_BMPWIN* win, int num, u8 figure, BOOL b_mark, NUMFONT_MARK mark )
{
	// ウィンドウ内を消去
	GF_BGL_BmpWinDataFill(win, GF_PRINTCOLOR_MAKE(0, 0, 0));

	if( b_mark )
	{
		NUMFONT_WriteSet( ptr->NumFont, mark, num, figure, NUMFONT_MODE_SPACE, win, 0, 0 );
	}
	else
	{
		NUMFONT_WriteNumber( ptr->NumFont, num, figure, NUMFONT_MODE_SPACE, win, 0, 0 );
	}

	GF_BGL_BmpWinOnVReq( win );
}

//-----------------------------------------------------------------------------
/**
 *	@brief	プリント強制終了
 *
 *	@param	MSG_CNT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_PrintEnd( MSG_CNT_PTR ptr )
{
	// 文字表示中ならタスクを終了させる
	if (ptr->MsgID != MSG_ID_NONE)
	{
		HOSAKA_PRINT( "check msg idx : %d \n", ptr->MsgID );
		GF_STR_PrintForceStop( ptr->MsgID );
	}

	if( ptr->MsgWin.ini )
	{
		BmpTalkWinClear( &ptr->MsgWin, WINDOW_TRANS_ON );
		GF_BGL_BmpWinOff( &ptr->MsgWin );
		GF_BGL_BmpWinDel( &ptr->MsgWin );
	}
}

//-----------------------------------------------------------------------------
/**
 *	@brief	プリントスキップフラグを立てる
 *
 *	@param	MSG_CNT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
void MSG_CNT_PrintSkip( MSG_CNT_PTR ptr )
{
	ptr->bSkip = TRUE;
}

//-----------------------------------------------------------------------------
/**
 *	@brief	ワードセットのポインタを取得
 *
 *	@param	MSG_CNT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
WORDSET* MSG_CNT_GetWordSet( MSG_CNT_PTR ptr )
{
	GF_ASSERT( ptr );
	GF_ASSERT( ptr->WordSet );

	return ptr->WordSet;
}


//-----------------------------------------------------------------------------
/**
 *	@brief	NUMFONTのポインタを取得
 *
 *	@param	MSG_CNT_PTR ptr
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
NUMFONT* MSG_CNT_GetNumFont( MSG_CNT_PTR ptr )
{
	GF_ASSERT( ptr );
	GF_ASSERT( ptr->NumFont );

	return ptr->NumFont;
}


//=============================================================================
/**
 *								static関数
 */
//=============================================================================

//----------------------------------------------------------------------------
/**
 *	@brief			メッセージウィンドウセット
 *
 *	@param	*bgl		BGL
 *	@param	inHeapID	ヒープID
 *
 *	@return
 */
//-----------------------------------------------------------------------------
static void MsgWinSet(GF_BGL_INI *bgl, u8 BgFrm, const int inHeapID)
{

	// ウィンドウ枠とパレットをＶＲＡＭへロード
	SystemFontPaletteLoad( PALTYPE_MAIN_BG, AGBPOKEMON_FRAMECOL * 32, inHeapID);
	TalkWinGraphicSet(bgl, BgFrm, AGBPOKEMON_TFRAMECHR, AGBPOKEMON_TFRAMECOL, /*wk->win_type*/0, inHeapID);
}

//----------------------------------------------------------------------------
/**
 *	@brief	メッセージウィンドウ作成
 *
 *	@param	*bgl		BGL
 *	@param  *win		ビットマップWin
 *	@param  **msg		メッセージバッファポインタ
 *	@param  *word		ワードセットポインタ
 *	@param  *msgman		メッセージマネージャポインタ
 *	@param  inMsgID		メッセージID
 *	@param	BgFrm		BGのフレーム番号
 *	@param  inHeapID	ヒープID
 *	@param	cfg			コンフィグデータ
 *
 *
 *	@return id			生成される文字描画ルーチンのインデックス
 */
//-----------------------------------------------------------------------------
static int CreateMsgWindow(GF_BGL_INI *bgl, GF_BGL_BMPWIN *win, STRBUF **msg,
		WORDSET *word, MSGDATA_MANAGER *msgman,
		const int inMsgID, const u8 BgFrm, const int inHeapID, const CONFIG* cfg )
{
	int id;
	int speed;

	GF_ASSERT(bgl);
	GF_ASSERT(cfg);

	// ウィンドウが登録されていなければ登録
	if(win->ini == NULL){
		GF_BGL_BmpWinAdd(bgl, win, BgFrm,
			     2, 19, 27, 4,
				 /*FONT_PALNO_NORMAL*/15, 0+1);

		// コンフィグにあわせたウィンドウを転送
		TalkWinGraphicSet( bgl, GF_BGL_BmpWinGet_Frame( win ),
				AGBPOKEMON_TFRAMECHR, AGBPOKEMON_TFRAMECOL,
				CONFIG_GetWindowType(cfg), inHeapID );

	}

	speed = CONFIG_GetMsgPrintSpeed(cfg);

	// ウィンドウ内を消去
	GF_BGL_BmpWinDataFill(win, GF_PRINTCOLOR_MAKE(15, 2, 15));

	// アーカイブから展開して表示
	*msg = MSGDAT_UTIL_AllocExpandString(word, msgman, inMsgID, inHeapID);

	id = GF_STR_PrintColor(win, FONT_TALK, *msg, 0, 0, speed, GF_PRINTCOLOR_MAKE( 1, 2, 15), NULL);

	BmpTalkWinWrite(win, WINDOW_TRANS_ON, AGBPOKEMON_TFRAMECHR, AGBPOKEMON_TFRAMECOL);

	return id;
}

//-----------------------------------------------------------------------------
/**
 *	@brief
 *
 *	@param
 *
 *	@retval
 */
//-----------------------------------------------------------------------------
static void PrintStaticMessage(GF_BGL_INI *bgl, GF_BGL_BMPWIN *win, WORDSET *word, MSGDATA_MANAGER *msgman,
		const int inMsgID, const u8 BgFrm, const u8 xofs, const u8 yofs, GF_PRINTCOLOR col, const int inHeapID)
{
	STRBUF* buf;

	// ウィンドウ内を消去
	GF_BGL_BmpWinDataFill(win, GF_PRINTCOLOR_MAKE(0, 0, 0));

	// アーカイブから展開して表示
	buf = MSGDAT_UTIL_AllocExpandString(word, msgman, inMsgID, inHeapID);
	GF_STR_PrintColor(win, FONT_SYSTEM, buf, xofs, yofs, 0, col, NULL);

	STRBUF_Delete( buf );
}
